////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2017-2018 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// THIS IS AUTO-GENERATED CODE.  PLEASE DO NOT EDIT (File bug reports against tools).
///
/// Auto-generated by: ParameterParser V1.1.4
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  aecface.h
/// @brief Auto-generated Chromatix parameter file
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef AECFACE_H
#define AECFACE_H

#include "parametermodule.h"
#include "parameterfilesymboltable.h"
#include "parametertypes.h"
#include "globalelements.h"
#include "aecglobalelements.h"

#define AECFACE_NAMESPACE_BEGIN namespace aecFace {
#define AECFACE_NAMESPACE_END }

AECFACE_NAMESPACE_BEGIN

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// FaceConvergenceType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct FaceConvergenceType
{

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// convSpeedAdjRatio
    ///
    /// Tuning Level:  often_tune
    /// Description:   Specify the adjustment of convergence speed during Face AEC convergence
    /// Range:         [0,10]
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    FLOAT convSpeedAdjRatio;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// speedAdjDelayTimeEnter
    ///
    /// Tuning Level:  rarely_tune
    /// Description:   Specify the delay in time to start adjusting Convergence speed
    /// Range:         [0,10]
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    FLOAT speedAdjDelayTimeEnter;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// speedAdjDelayTimeExit
    ///
    /// Tuning Level:  rarely_tune
    /// Description:   Specify the delay in time to start adjusting Convergence speed
    /// Range:         [0,10]
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    FLOAT speedAdjDelayTimeExit;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// FaceMeteringType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct FaceMeteringType
{

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// enableFaceROI
    ///
    /// Tuning Level:  often_tune
    /// Description:   Enable Flag for Face ROI AEC Adjustments
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    BOOL                          enableFaceROI;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// weightTemporalFilter
    ///
    /// Tuning Level:  never_tune
    /// Description:   Temporal weight for Face Luma and Metered luma transition. Higher weight will have faster transition to
    ///                Face Luma
    /// Range:         [0,1]
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    FLOAT                         weightTemporalFilter;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// centerWeightStrength
    ///
    /// Tuning Level:  rarely_tune
    /// Description:   Specify weighting of luma in the center of Face ROI
    /// Range:         [0,1]
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    FLOAT                         centerWeightStrength;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// statsUpdateDelayTimeEnter
    ///
    /// Tuning Level:  rarely_tune
    /// Description:   Specify the delay in time to declare official Face ROI, for detection Stability
    /// Range:         [0,10]
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    FLOAT                         statsUpdateDelayTimeEnter;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// statsUpdateDelayTimeExit
    ///
    /// Tuning Level:  rarely_tune
    /// Description:   Specify the delay in time to declare official Face ROI, for detection Stability
    /// Range:         [0,10]
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    FLOAT                         statsUpdateDelayTimeExit;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// enableBackLitComp
    ///
    /// Tuning Level:  rarely_tune
    /// Description:   Enable Flag for Back lit compensation for face AEC
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    BOOL                          enableBackLitComp;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// backlitWeighttAdjSettings
    ///
    /// Tuning Level:  never_tune
    /// Description:   Threshold pair to determine backlit interpolation weight.
    /// Comments:       Base Type Tuning Definition
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    aecglobalelements::StartEndType                  backlitWeighttAdjSettings;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// thresBackLitLumaRatio
    ///
    /// Tuning Level:  never_tune
    /// Description:   Threshold pair of luma ratio to determine backlit severity.
    /// Comments:       Base Type Tuning Definition
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    aecglobalelements::StartEndType                  thresBackLitLumaRatio;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// enableHistLumaTargetSuppression
    ///
    /// Tuning Level:  rarely_tune
    /// Description:   Enable Flag for suppressing Histogram AEC adjustments. Enabling will make larger face luma to be more
    ///                stable among different background, sacrificing background brightness.
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    BOOL                          enableHistLumaTargetSuppression;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// faceWeight
    ///
    /// Tuning Level:  never_tune
    /// Description:   Min and Max face luma weight wrt face size.
    /// Comments:       Base Type Tuning Definition
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    aecglobalelements::StartEndType                  faceWeight;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// faceLumaWeightLuxIndexTrigger
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    struct faceLumaWeightLuxIndexTriggerStruct
    {

        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// enableFaceLumaTrigger
        ///
        /// Tuning Level:  rarely_tune
        /// Description:   Enable Flag for for adjusting luma weight based on lux index
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        BOOL              enableFaceLumaTrigger;

        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// LuxFaceLumaWeight
        ///
        /// Description:   Face weight tuning structure, which is shared between normal and flash use case.
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        aecglobalelements::LuxFaceWeightType LuxFaceLumaWeight;
    } faceLumaWeightLuxIndexTrigger;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// faceSize
    ///
    /// Tuning Level:  never_tune
    /// Description:   min and max face size to determine face weight
    /// Comments:       Base Type Tuning Definition
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    aecglobalelements::StartEndType                  faceSize;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// faceSizeWeightLuxIndexTrigger
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    struct faceSizeWeightLuxIndexTriggerStruct
    {

        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// enableFaceSizeTrigger
        ///
        /// Tuning Level:  rarely_tune
        /// Description:   Enable Flag for for adjusting face size weight based on lux index
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        BOOL              enableFaceSizeTrigger;

        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// LuxFaceSizeWeight
        ///
        /// Description:   Face weight tuning structure, which is shared between normal and flash use case.
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        aecglobalelements::LuxFaceWeightType LuxFaceSizeWeight;
    } faceSizeWeightLuxIndexTrigger;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// AECFaceType
/// Comments:       Face Tuning Definition
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct AECFaceType
{
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Binary file symbol table entry ID
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    UINT32 SymbolTableID;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// module_version
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    struct module_versionStruct
    {
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// Binary file symbol table entry ID
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        UINT32 SymbolTableID;
        INT32 major_revision;
        INT32 minor_revision;
        INT32 incr_revision;
    } module_version;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// faceMtr
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    FaceMeteringType    faceMtr;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// faceConv
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    FaceConvergenceType faceConv;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// AECFaceTypeClass
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class AECFaceTypeClass : public ParameterModule, public AECFaceType
{
public:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Version
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static const UINT16 MAJOR = 1;
    static const UINT16 MINOR = 0;
    static const UINT32 PATCH = 0;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Default Constructor
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    AECFaceTypeClass(
        const CHAR* name);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Constructor
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    AECFaceTypeClass(
        const CHAR* name,
        UINT32 modeId,
        UINT16 mode,
        UINT16 subMode,
        UINT32 group);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Destructor
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual ~AECFaceTypeClass();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetName
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static const CHAR* GetName(
        const CHAR* type);


    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load FaceConvergenceType
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadFaceConvergenceType(
        ParameterFileSymbolTableEntry* entry,
        FaceConvergenceType* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load FaceMeteringType
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadFaceMeteringType(
        ParameterFileSymbolTableEntry* entry,
        FaceMeteringType* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load FaceMeteringType_faceLumaWeightLuxIndexTriggerStruct
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadFaceMeteringType_faceLumaWeightLuxIndexTriggerStruct(
        ParameterFileSymbolTableEntry* entry,
        FaceMeteringType::faceLumaWeightLuxIndexTriggerStruct* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load FaceMeteringType_faceSizeWeightLuxIndexTriggerStruct
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadFaceMeteringType_faceSizeWeightLuxIndexTriggerStruct(
        ParameterFileSymbolTableEntry* entry,
        FaceMeteringType::faceSizeWeightLuxIndexTriggerStruct* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load AECFaceType
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadAECFaceType(
        ParameterFileSymbolTableEntry* entry,
        AECFaceType* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load module_versionStruct
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL Loadmodule_versionStruct(
        ParameterFileSymbolTableEntry* entry,
        AECFaceType::module_versionStruct* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Unload FaceMeteringType
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static void UnloadFaceMeteringType(
        FaceMeteringType* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Unload FaceMeteringType_faceLumaWeightLuxIndexTriggerStruct
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static void UnloadFaceMeteringType_faceLumaWeightLuxIndexTriggerStruct(
        FaceMeteringType::faceLumaWeightLuxIndexTriggerStruct* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Unload FaceMeteringType_faceSizeWeightLuxIndexTriggerStruct
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static void UnloadFaceMeteringType_faceSizeWeightLuxIndexTriggerStruct(
        FaceMeteringType::faceSizeWeightLuxIndexTriggerStruct* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Unload AECFaceType
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static void UnloadAECFaceType(
        AECFaceType* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Parse symbol table entry, and return a new object
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual ParameterModule* Parse(
        ParameterSetManager* manager,
        ParameterFileSymbolTableEntry* entry) const;

}; // End class AECFaceTypeClass

AECFACE_NAMESPACE_END
#endif // AECFACE_H

